package cn.maszy.common;

import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownLoadAction extends ActionSupport{
	/**
	 * 版本信息
	 */
	private static final long serialVersionUID = 1L;
	// 初始的通过param指定的文件名属性
    private String fileName;
    // 指定要被下载的文件路径，struts.xml中配置
    private String inputPath;
 
    public void setInputPath(String value) {
       inputPath = value;
    }
 
    public void setFileName(String fileName) {
       this.fileName = fileName;
    }
 
    public String getFileName() {
       return fileName;
    }
 
    public InputStream getInputStream() throws Exception {
       String url = inputPath+ "/" + new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
       int size = url.length() - 1;
 
       // 把url字符串中原有的反斜杠替换成斜杠，若不替换则会因为斜杠和反斜杠并存而导致错误
       for (int i = 0; i < size; i++){
           url = url.replace("//", "/");
       }
 
       return ServletActionContext.getServletContext().getResourceAsStream(url);
    }
    
    @Override
    public String execute() throws Exception {
       /*
        * 获取目标文件在服务器中保存的目录。若不在这个目录则拒绝下载，否则，
        * 稍微精通struts2的人可能试图获取WEB-INF下的文件，那就不安全了。
        */
       String downloadDir = ServletActionContext.getServletContext().getRealPath("/uploadFile");
       // 获取目标文件的绝对路径
       String downloadFile = ServletActionContext.getServletContext().getRealPath(inputPath);
       /*
        * 防止企图下载不在目录downloadDir下的文件，以保障安全。若不在这个目
        * 录则拒绝下载，否则，稍微精通struts2的人可能试图获取WEB-INF下 的文件，那就不安全了。
        */
       if (!downloadFile.startsWith(downloadDir)) {
           return null;
       }
       return SUCCESS;
    }

}
